"""
中国工商银行账户管理系统
a)用户程序：账号（str：系统随机产生8位数字）、姓名(str)、密码(int:6位数字)、地址、存款余额(int)、开户行（银行的名称（str））
b)地址程序：国家(str)、省份(str)、街道(str)、门牌号(str)
c)银行程序：能存储100用户的库(字典)、本银行名称（比如：中国工商银行的昌平支行,str）

银行业务功能
1.添加用户（传入参数：用户的所有信息。返回值：整型值（1：成功，2：用户已存在，3：用户库已满））
2.存钱（传入值：用户的账号、存取的金额。返回值：布尔类型值）
3.取钱（传入值：用户的账号，用户密码，取钱金额。返回值：整型值（0：正常，1：账号不存在，2：密码不对，3：钱不够））
4.转账（传入值：转出的账号，转入的账号，转出账号的密码，转出的金额。返回值：0：正常，1：账号不对，2密码不对，3钱不够）
5.查询账户功能（传入值：账号，账号密码，返回值：空）当前账号：xxxx,密码:xxxxxx,余额：xxxx元，用户居住地址：xxxxxxxxxxxxx，当前账户的开户行：xxxxxxxxxx.

界面程序：在执行该入口程序时，就打印银行业务选择菜单：
然后就开始处理各种输入操作，直到业务处理完成!
"""
import random # 用于获取随机数
import copy # 用于深拷贝
import time
import json # 用户数据写入到json文件中

BANK_NAME='中国工商银行的昌平支行'
MAX_SIZE=4

situation_dict={
    1:'成功',
    2:'用户库已满',
    3:'账号不存在',
    4:'密码有误',
    5:'余额不足'
}

bank = {} # 银行：嵌套字典 key为用户账号；用户：字典；地址：列表

def get_accont():
    """获取账号名"""
    # return str(random.randint(10000000, 99999999))
    return str(random.randint(100, 999))

def get_addr():
    """获取用户地址"""
    original_address=input('请输入地址：国家、省份、街道、门牌号(用空格隔开)\n')
    address=original_address.split(' ')
    return address

def get_user_info():
    user={}
    user['name']=input('请输入用户名：')
    user['password']=input('请输入密码： ')
    user['address']=get_addr()
    user['balance']=0
    user['bank']=BANK_NAME
    return user

def save_to_json(data,filename):
    with open(filename,'w') as f:
        json.dump(data,f,indent=4,ensure_ascii=False) # 非ASCII码字符原样输出

def load_from_json(filename):
    try:
        with open(filename,'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return {} # 如果文件不存在，返回空字典

def add_user():
    """添加用户"""
    if len(bank)>=MAX_SIZE:
        return 2
    # 账号不应该已存在，必须生成一个唯一账号让用户完成添加
    account=get_accont()
    while True:
        if account not in bank.keys():
            break
        else:
            account=get_accont()
    user=get_user_info()
    bank[account] = copy.deepcopy(user) # 添加成功
    print('开户',account)
    return 1

def save_money():
    account=input('请输入账户：')
    password=input('请输入密码： ')
    balance = int(input('请输入存钱金额：'))
    if account not in bank.keys():
        return 3
    elif bank[account]['password']!=password:
        return 4
    else:
        bank[account]['balance']+=balance
        return 1

def withdraw_money():
    account=input('请输入账户：')
    password=input('请输入密码： ')
    balance=int(input('请输入取钱金额：'))
    if account not in bank.keys():
        return 3
    elif bank[account]['password']!=password:
        return 4
    elif bank[account]['balance']<balance:
        return 5
    else:
        bank[account]['balance']-=balance
        return 1

def transfer_accounts():
    account = input('请输入账户：')
    password = input('请输入密码： ')
    if account not in bank.keys() :
        return 3
    elif bank[account]['password']!=password:
        return 4
    else:
        account_in = input('请输入要转账的账户：')
        balance = int(input('请输入转账金额：'))
        if account_in not in bank.keys():
            return 3
        elif bank[account]['balance']<balance:
            return 5
        else:
            bank[account]['balance']-=balance
            bank[account_in]['balance']+=balance
            return 1

def inquiry_account():
    account = input('请输入账户：')
    password = input('请输入密码： ')
    if account not in bank.keys() :
        return 3
    elif bank[account]['password']!=password:
        return 4
    else:
        print('当前账号：{}，密码：{}，用户名：{},余额：{}元，'
              '\t用户居住地址：{}，\t当前账号的开会行：{}'.format(account,bank[account]['password'],
                                                               bank[account]['name'],bank[account]['balance'],
                                                               ' '.join(bank[account]['address']),bank[account]['bank']))

def get_surface():
    surface="""
    -----------------------------------------
               中国工商银行
               账号管理系统
    -----------------------------------------
    1. 开户
    2. 存钱
    3. 取钱
    4. 转账
    5. 查询
    6. Bye!
    -----------------------------------------
    """
    print(surface)

if __name__ == '__main__':
    bank=load_from_json('bank_data.json')
    while True:
        get_surface()
        input_select=int(input('请输入您的选择：'))
        if input_select == 1:
            res=add_user()
        elif input_select == 2:
            res=save_money()
        elif input_select == 3:
            res=withdraw_money()
        elif input_select == 4:
            res=transfer_accounts()
        elif input_select == 5:
            inquiry_account()
            time.sleep(3)
            continue
        else:
            print('Bye!')
            break
        if res==1:
            save_to_json(bank, 'bank_data.json')
        print(situation_dict[res])
        time.sleep(3)
